package leetcode.code0024;

import leetcode.helper.tree.ListNode;

public class Solution extends Solution24 {


	@Override
	public ListNode swapPairs(ListNode head) {
//		if (head == null) 后续能覆盖 null头不进while, 出来直接就是null
//			return null;
//		if (head.next == null) 等同于p1 == null, 奇数个节点的情况, 直接给head接上就结束
//			return head;
		ListNode ans1 = new ListNode();// 答案的头结点, ans1.next是答案的头
		ListNode ans2 = ans1;// 答案的尾节点, 开始的时候在一起
		ListNode p1 = null;// 偶数针
		while (head != null) {// head指向奇数节点
			p1 = head.next;// 指向偶数节点
			if (p1 == null) {
				ans2.next = head;// 没有偶数节点, 奇数交给答案
				ans2 = ans2.next;// ans到偶数上
				break;
			} else {
				ans2.next = p1;// 有偶数就先给偶数
			}
			ans2 = ans2.next;// ans到偶数上
			p1 = p1.next;// 为了不断线, 偶数针, 提前到奇数上埋伏
			ans2.next = head;// 奇数给答案, 至此, 最近的两个节点, 以ans.next->偶数->奇数 方式串联
			ans2 = ans2.next;// ans到尾部, 等待接收答案
			head = p1;// head到新的奇偶节点的奇数节点上, 恢复到while语义的初始状态
		}
		ans2.next = null;// 断尾 跳出while, ans2后续没有数字了
		return ans1.next;
	}

	public static void main(String[] args) {
		Solution so = new Solution();
		so.debug1();
		so.debug2();
		so.debug3();

	}

}
